// Biblotecas estandar
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "common.h"
#include "./API/APIPersona.h"


int procesarArgumentos(int argc, char *argv[], int *cantPuertas, long *idPersona);
void mostrarError(long idPersona);
		
	
int main(int argc, char* argv[]) {
	long idPersona;
	int cantPuertas;
	int error = 0;
	char buffer[100];

	if (procesarArgumentos(argc, argv, &cantPuertas, &idPersona)) {
		exit(1);
	}

	// Inicializo la semilla del generador aleatorio de números y instancio 
	// a la API
	srand(getpid());	
	APIPersona api = APIPersona();	

	sprintf(buffer, "Persona %ld llama a entrarASala\n", idPersona);
	write(fileno(stdout), buffer, strlen(buffer));
	api.entrarASala(idPersona, (rand() % cantPuertas) + 1, &error);
	if (error == ZIPC_FAILURE) { 
		mostrarError(idPersona);
		return 1;
	}
	
	// Simular tiempo en pasar la puerta de la sala
	//usleep(1000 * (rand() % 5000) + 500);
	

	sprintf(buffer, "Persona %ld llama a subirACamion\n", idPersona);
	write(fileno(stdout), buffer, strlen(buffer));
	api.subirACamion(idPersona, &error);
	if (error == ZIPC_FAILURE) {
		mostrarError(idPersona);
		return 1;
	}
	
	// Simular tiempo en subir al camión
	// TODO
	
	sprintf(buffer, "Persona %ld llama a bajarDeCamion\n", idPersona);
	write(fileno(stdout), buffer, strlen(buffer));
	api.bajarDeCamion(idPersona, &error);
	if (error == ZIPC_FAILURE) {
		mostrarError(idPersona);
		return 1;
	}
}


int procesarArgumentos(int argc, char * argv[], int *cantPuertas, long *idPersona) {
	char buffer[100];

	if (argc != 3)
	{
		sprintf(buffer, "Persona - Error: Cantidad de argumentos pasados al programa incorrectos\n");
		write(fileno(stdout), buffer, strlen(buffer));
		return 1;
	}
	
	sscanf(argv[1], "%d", cantPuertas); 
	if (*cantPuertas < 1)
	{
		sprintf(buffer, "Persona - Error: La cantidad de puertas debe ser un número mayor o igual a 1\n");
		write(fileno(stdout), buffer, strlen(buffer));
		return 2;
	}
	
	sscanf(argv[2], "%ld", idPersona);
	return 0;
}

void mostrarError(long idPersona)
{
	char buffer[100];
	sprintf(buffer, "Persona %ld: %s\n", idPersona, strerror(errno));
	write(fileno(stderr), buffer, strlen(buffer));
}
